package com.atguigu.gmall.mq.receiver;

import com.atguigu.gmall.mq.config.DeadLetterMqConfig;
import com.atguigu.gmall.mq.config.DelayedMqConfig;
import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.Date;

/**
 * 接收消息
 */
@Component
public class MessageReceiver {


    //接收延迟消息
   @RabbitListener(queues = DeadLetterMqConfig.queue_dead_2)
   public void deadLetterMessage(String msg, Channel channel, Message message){
       System.out.println("接收延迟消息：" + msg + ":时间：" + new Date());

       //手动应答  略
   }


    //接收延迟消息
    @RabbitListener(queues = DelayedMqConfig.queue_delay_1)
    public void delayedMessage(String msg, Channel channel, Message message){
        System.out.println("接收延迟消息：" + msg + ":时间：" + new Date());
        //手动应答  略
    }





    //接收    交换机  RoutingKey 队列   绑定一起     打注解也可以在MQ服务器自动创建交换机队列 进行绑定
    @RabbitListener(bindings = {@QueueBinding(
            value = @Queue(value = "queue11",autoDelete = "false",durable = "true"),
            exchange = @Exchange(value = "exchange11"),
            key = {"routingKey11"}
    )})
    public void receiverMessage(String msg, Channel channel, Message message){
        try {
            System.out.println(msg);//处理消息
            //int i = 1/0;//抛异常 手动应答 不写    积压 无限死循环
            //应答
            //参数1：标记 应答的哪个消息
            //参数2： Queue  将消息删除吧 true     Queue 将消息不要删除 false
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),true);
        } catch (Exception e) {
            //e.printStackTrace();
            //判断是否第一次发来消息 如果是第一次 允许一次
            if(message.getMessageProperties().isRedelivered()){
                //第二次
                //参数1：标记 应答的哪个消息
                //参数2：是否将此消息重新消费   true重新消费   false:不重新消费
                try {
                    System.out.println("已经是第二次接收了、拒绝再次消费");
                    channel.basicReject(message.getMessageProperties().getDeliveryTag(),false);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }else{
                //第一次
                //参数1：标记 应答的哪个消息
                //参数2：是否批量
                //参数3：是否将此消息重新消费   true重新消费   false:不重新消费
                try {
                    System.out.println("给一次机会、重新接收一次");
                    channel.basicNack(message.getMessageProperties().getDeliveryTag(),
                            false,true);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }
        //手动应答 不写
    }
}
